//
// Created by root on 10/26/18.
//

#ifndef URSAX_LOG_H
#define URSAX_LOG_H

#include <stdbool.h>
#include <time.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

//debug; info; warn; error; fatal
#define DEBUG		0
#define INFO		1
#define WARN		2
#define ERROR		3
#define FATAL		4

#ifndef INIT_LOG_LEVEL
#define INIT_LOG_LEVEL 1
#endif

#ifndef USE_LOCAL_LOG_LEVEL
extern unsigned int __log_level;
#else
static unsigned int __log_level = INIT_LOG_LEVEL;
#endif

#define register_local_log_level(name)	__register_local_log_level(name, &__log_level)


void log_printf(unsigned int level, const char* func, const char* str, ...);


int log_load_conf(const char* filename);
int log_reload_conf(bool pre_register);

void log_install_signal_handler(int sig);
int log_set_output(const char* filename);

int file_rotate(char* path);
int log_reopen_output(void);

//#define LOG_DISABLED

#ifndef LOG_DISABLED
#define LOG_PRINTF(l, msg, ...)				\
	if (__log_level <= l)					\
		log_printf(l, __func__, msg, ##__VA_ARGS__)
#else
#define LOG_PRINTF(l, msg, ...)
#endif




#ifndef LOG_DEBUG
#define LOG_DEBUG(msg, ...)			LOG_PRINTF(DEBUG, msg, ##__VA_ARGS__)
#endif
#ifndef LOG_INFO
#define LOG_INFO(msg, ...)			LOG_PRINTF(INFO,  msg, ##__VA_ARGS__)
#endif
#define LOG_WARN(msg, ...)			LOG_PRINTF(WARN,  msg, ##__VA_ARGS__)
#define LOG_ERROR(msg, ...)			LOG_PRINTF(ERROR, msg, ##__VA_ARGS__)
#define LOG_FATAL(msg, ...)			LOG_PRINTF(FATAL, msg, ##__VA_ARGS__)


#ifdef __cplusplus
}
#endif

#endif //URSAX_LOG_H
